import { AppDataSource } from '../../db/index'
import { Article } from '../../db/entities/Article'
import { Tag } from '../../db/entities/Tag'

const articleRepository = AppDataSource.getRepository(Article)
const tagRepository = AppDataSource.getRepository(Tag)

export default defineEventHandler(async (event) => {
  // h3提供的工具方法
  const body = await readBody(event)
  console.log('body')
  console.log(body)

  // 插入
  try {
    // 查询到标签表里面的数据, body.tags 是数组
    let tagList: Array<any> = []

    // 这里必须判断一下，否则下面的sql会报错
    if (body.tags && body.tags.length) {
      tagList = await tagRepository
        .createQueryBuilder('tag')
        .where('tag.tag_id IN (:...name)', { name: body.tags })
        .getMany()
    }

    // console.log('tagList')
    // console.log(tagList)

    // 第一种写法，save会自动维护关联表（article_tags_tag)
    // await articleRepository.save({
    //   title: body.title,
    //   content: body.content,
    //   secondTitle: body.subTitle,
    //   createTime: new Date(),
    //   tags: tagList
    // })

    let data = Object.assign({}, body)

    delete data.tags

    console.log(data)

    let row = await AppDataSource.createQueryBuilder()
      .insert()
      .into(Article)
      .values([
        // {
        //   title: body.title,
        //   content: body.content,
        //   createTime: new Date()
        //   // 使用 createQueryBuilder 就不能这样去维护关联表了
        //   // tags: tagList
        // }
        data
      ])
      .execute()

    if (tagList.length) {
      // 使用 createQueryBuilder 需要手动维护 article 与 tag 表的关联表
      let articleTagsData = tagList.map((item) => {
        return {
          // 拿到插入的文章id
          article_id: row.identifiers[0].id,
          // tagTagId 是数据库表在生成关联表的时候取的，要修改需要修改实体类的relations 里面的名字
          tag_id: item.tag_id
        }
      })

      await AppDataSource.createQueryBuilder()
        .insert()
        .into('article_tags') // 根据 TypeORM 的命名规则，手动指定中间表
        .values(articleTagsData)
        .execute()
    }
    return {
      message: '操作成功',
      data: null,
      code: 0
    }
  } catch (error: any) {
    console.log('新增文章失败')
    console.log(error)

    return {
      message: '操作失败' + error.message,
      data: null,
      code: 1000
    }
  }
})
